{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 0
   },
   "source": [
    "# 全卷积网络\n",
    ":label:`sec_fcn`\n",
    "\n",
    "如 :numref:`sec_semantic_segmentation`中所介绍的那样，语义分割是对图像中的每个像素分类。\n",
    "*全卷积网络*（fully convolutional network，FCN）采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:`Long.Shelhamer.Darrell.2015`。\n",
    "与我们之前在图像分类或目标检测部分介绍的卷积神经网络不同，全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸：这是通过在 :numref:`sec_transposed_conv`中引入的*转置卷积*（transposed convolution）实现的。\n",
    "因此，输出的类别预测与输入图像在像素级别上具有一一对应关系：通道维的输出即该位置对应像素的类别预测。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "origin_pos": 2,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import torch\n",
    "import torchvision\n",
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "from d2l import torch as d2l"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 3
   },
   "source": [
    "## 构造模型\n",
    "\n",
    "下面我们了解一下全卷积网络模型最基本的设计。\n",
    "如 :numref:`fig_fcn`所示，全卷积网络先使用卷积神经网络抽取图像特征，然后通过$1\\times 1$卷积层将通道数变换为类别个数，最后在 :numref:`sec_transposed_conv`中通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。\n",
    "因此，模型输出与输入图像的高和宽相同，且最终输出通道包含了该空间位置像素的类别预测。\n",
    "\n",
    "![全卷积网络](../img/fcn.svg)\n",
    ":label:`fig_fcn`\n",
    "\n",
    "下面，我们[**使用在ImageNet数据集上预训练的ResNet-18模型来提取图像特征**]，并将该网络记为`pretrained_net`。\n",
    "ResNet-18模型的最后几层包括全局平均汇聚层和全连接层，然而全卷积网络中不需要它们。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "origin_pos": 5,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Sequential(\n",
       "   (0): BasicBlock(\n",
       "     (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
       "     (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "     (relu): ReLU(inplace=True)\n",
       "     (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "     (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "     (downsample): Sequential(\n",
       "       (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
       "       (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "     )\n",
       "   )\n",
       "   (1): BasicBlock(\n",
       "     (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "     (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "     (relu): ReLU(inplace=True)\n",
       "     (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "     (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "   )\n",
       " ),\n",
       " AdaptiveAvgPool2d(output_size=(1, 1)),\n",
       " Linear(in_features=512, out_features=1000, bias=True)]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pretrained_net = torchvision.models.resnet18(pretrained=True) \n",
    "list(pretrained_net.children())[-3:] #列出来网络的所有的层children，列出来最后的三层"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 6
   },
   "source": [
    "接下来，我们[**创建一个全卷积网络`net`**]。\n",
    "它复制了ResNet-18中大部分的预训练层，除了最后的全局平均汇聚层和最接近输出的全连接层。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "origin_pos": 8,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "net = nn.Sequential(*list(pretrained_net.children())[:-2]) # 去掉最后的两层"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 9
   },
   "source": [
    "给定高度为320和宽度为480的输入，`net`的前向传播将输入的高和宽减小至原来的$1/32$，即10和15。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "origin_pos": 11,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 512, 10, 15])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = torch.rand(size=(1, 3, 320, 480))\n",
    "net(X).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 12
   },
   "source": [
    "接下来，我们[**使用$1\\times1$卷积层将输出通道数转换为Pascal VOC2012数据集的类数（21类）。**]\n",
    "最后，我们需要(**将特征图的高度和宽度增加32倍**)，从而将其变回输入图像的高和宽。\n",
    "回想一下 :numref:`sec_padding`中卷积层输出形状的计算方法：\n",
    "由于$(320-64+16\\times2+32)/32=10$且$(480-64+16\\times2+32)/32=15$，我们构造一个步幅为$32$的转置卷积层，并将卷积核的高和宽设为$64$，填充为$16$。\n",
    "我们可以看到如果步幅为$s$，填充为$s/2$（假设$s/2$是整数）且卷积核的高和宽为$2s$，转置卷积核会将输入的高和宽分别放大$s$倍。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "origin_pos": 14,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "num_classes = 21\n",
    "# out=num_classes 降低计算量\n",
    "net.add_module('final_conv', nn.Conv2d(512, num_classes, kernel_size=1))\n",
    "# stride=32 放大32倍 padding=16 高宽不变的最小值 kenel_size=64 每次跳一半\n",
    "net.add_module('transpose_conv', nn.ConvTranspose2d(num_classes, num_classes,\n",
    "                                    kernel_size=64, padding=16, stride=32)) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 15
   },
   "source": [
    "## [**初始化转置卷积层**]\n",
    "\n",
    "在图像处理中，我们有时需要将图像放大，即*上采样*（upsampling）。\n",
    "*双线性插值*（bilinear interpolation）\n",
    "是常用的上采样方法之一，它也经常用于初始化转置卷积层。\n",
    "\n",
    "为了解释双线性插值，假设给定输入图像，我们想要计算上采样输出图像上的每个像素。\n",
    "首先，将输出图像的坐标$(x,y)$映射到输入图像的坐标$(x',y')$上。\n",
    "例如，根据输入与输出的尺寸之比来映射。\n",
    "请注意，映射后的$x′$和$y′$是实数。\n",
    "然后，在输入图像上找到离坐标$(x',y')$最近的4个像素。\n",
    "最后，输出图像在坐标$(x,y)$上的像素依据输入图像上这4个像素及其与$(x',y')$的相对距离来计算。\n",
    "\n",
    "双线性插值的上采样可以通过转置卷积层实现，内核由以下`bilinear_kernel`函数构造。\n",
    "限于篇幅，我们只给出`bilinear_kernel`函数的实现，不讨论算法的原理。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "origin_pos": 17,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "def bilinear_kernel(in_channels, out_channels, kernel_size):\n",
    "    factor = (kernel_size + 1) // 2\n",
    "    if kernel_size % 2 == 1:\n",
    "        center = factor - 1\n",
    "    else:\n",
    "        center = factor - 0.5\n",
    "    og = (torch.arange(kernel_size).reshape(-1, 1),\n",
    "          torch.arange(kernel_size).reshape(1, -1))\n",
    "    filt = (1 - torch.abs(og[0] - center) / factor) * \\\n",
    "           (1 - torch.abs(og[1] - center) / factor)\n",
    "    weight = torch.zeros((in_channels, out_channels,\n",
    "                          kernel_size, kernel_size))\n",
    "    weight[range(in_channels), range(out_channels), :, :] = filt\n",
    "    return weight"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 18
   },
   "source": [
    "让我们用[**双线性插值的上采样实验**]它由转置卷积层实现。\n",
    "我们构造一个将输入的高和宽放大2倍的转置卷积层，并将其卷积核用`bilinear_kernel`函数初始化。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "origin_pos": 20,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "conv_trans = nn.ConvTranspose2d(3, 3, kernel_size=4, padding=1, stride=2,\n",
    "                                bias=False)\n",
    "# 使用双线性插值初始化转置卷积层的参数\n",
    "conv_trans.weight.data.copy_(bilinear_kernel(3, 3, 4));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 21
   },
   "source": [
    "读取图像`X`，将上采样的结果记作`Y`。为了打印图像，我们需要调整通道维的位置。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "origin_pos": 23,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "# 读取图像\n",
    "img = torchvision.transforms.ToTensor()(d2l.Image.open('../img/catdog.jpg'))\n",
    "X = img.unsqueeze(0)\n",
    "# 转置卷积操作\n",
    "Y = conv_trans(X)\n",
    "out_img = Y[0].permute(1, 2, 0).detach()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 24
   },
   "source": [
    "可以看到，转置卷积层将图像的高和宽分别放大了2倍。\n",
    "除了坐标刻度不同，双线性插值放大的图像和在 :numref:`sec_bbox`中打印出的原图看上去没什么两样。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "origin_pos": 26,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input image shape: torch.Size([561, 728, 3])\n",
      "output image shape: torch.Size([1122, 1456, 3])\n"
     ]
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
       "<svg height=\"170.716782pt\" version=\"1.1\" viewBox=\"0 0 223.20508 170.716782\" width=\"223.20508pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       " <metadata>\n",
       "  <rdf:RDF xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n",
       "   <cc:Work>\n",
       "    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n",
       "    <dc:date>2022-02-07T17:28:50.433664</dc:date>\n",
       "    <dc:format>image/svg+xml</dc:format>\n",
       "    <dc:creator>\n",
       "     <cc:Agent>\n",
       "      <dc:title>Matplotlib v3.3.3, https://matplotlib.org/</dc:title>\n",
       "     </cc:Agent>\n",
       "    </dc:creator>\n",
       "   </cc:Work>\n",
       "  </rdf:RDF>\n",
       " </metadata>\n",
       " <defs>\n",
       "  <style type=\"text/css\">*{stroke-linecap:butt;stroke-linejoin:round;}</style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 170.716782 \n",
       "L 223.20508 170.716782 \n",
       "L 223.20508 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill:none;\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 39.65 146.838657 \n",
       "L 216.00508 146.838657 \n",
       "L 216.00508 10.938657 \n",
       "L 39.65 10.938657 \n",
       "z\n",
       "\" style=\"fill:#ffffff;\"/>\n",
       "   </g>\n",
       "   <g clip-path=\"url(#p1fee7d7dcf)\">\n",
       "    <image height=\"136\" id=\"image58fc7b456c\" transform=\"scale(1 -1)translate(0 -136)\" width=\"177\" x=\"40\" xlink:href=\"data:image/png;base64,\n",
       "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\" y=\"-10.716782\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\">\n",
       "    <g id=\"xtick_1\">\n",
       "     <g id=\"line2d_1\">\n",
       "      <defs>\n",
       "       <path d=\"M 0 0 \n",
       "L 0 3.5 \n",
       "\" id=\"m5780cffe78\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.710561\" xlink:href=\"#m5780cffe78\" y=\"146.838657\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_1\">\n",
       "      <!-- 0 -->\n",
       "      <g transform=\"translate(36.529311 161.437095)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 31.78125 66.40625 \n",
       "Q 24.171875 66.40625 20.328125 58.90625 \n",
       "Q 16.5 51.421875 16.5 36.375 \n",
       "Q 16.5 21.390625 20.328125 13.890625 \n",
       "Q 24.171875 6.390625 31.78125 6.390625 \n",
       "Q 39.453125 6.390625 43.28125 13.890625 \n",
       "Q 47.125 21.390625 47.125 36.375 \n",
       "Q 47.125 51.421875 43.28125 58.90625 \n",
       "Q 39.453125 66.40625 31.78125 66.40625 \n",
       "z\n",
       "M 31.78125 74.21875 \n",
       "Q 44.046875 74.21875 50.515625 64.515625 \n",
       "Q 56.984375 54.828125 56.984375 36.375 \n",
       "Q 56.984375 17.96875 50.515625 8.265625 \n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \n",
       "Q 6.59375 17.96875 6.59375 36.375 \n",
       "Q 6.59375 54.828125 13.0625 64.515625 \n",
       "Q 19.53125 74.21875 31.78125 74.21875 \n",
       "z\n",
       "\" id=\"DejaVuSans-48\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_2\">\n",
       "     <g id=\"line2d_2\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"100.272059\" xlink:href=\"#m5780cffe78\" y=\"146.838657\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_2\">\n",
       "      <!-- 500 -->\n",
       "      <g transform=\"translate(90.728309 161.437095)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 10.796875 72.90625 \n",
       "L 49.515625 72.90625 \n",
       "L 49.515625 64.59375 \n",
       "L 19.828125 64.59375 \n",
       "L 19.828125 46.734375 \n",
       "Q 21.96875 47.46875 24.109375 47.828125 \n",
       "Q 26.265625 48.1875 28.421875 48.1875 \n",
       "Q 40.625 48.1875 47.75 41.5 \n",
       "Q 54.890625 34.8125 54.890625 23.390625 \n",
       "Q 54.890625 11.625 47.5625 5.09375 \n",
       "Q 40.234375 -1.421875 26.90625 -1.421875 \n",
       "Q 22.3125 -1.421875 17.546875 -0.640625 \n",
       "Q 12.796875 0.140625 7.71875 1.703125 \n",
       "L 7.71875 11.625 \n",
       "Q 12.109375 9.234375 16.796875 8.0625 \n",
       "Q 21.484375 6.890625 26.703125 6.890625 \n",
       "Q 35.15625 6.890625 40.078125 11.328125 \n",
       "Q 45.015625 15.765625 45.015625 23.390625 \n",
       "Q 45.015625 31 40.078125 35.4375 \n",
       "Q 35.15625 39.890625 26.703125 39.890625 \n",
       "Q 22.75 39.890625 18.8125 39.015625 \n",
       "Q 14.890625 38.140625 10.796875 36.28125 \n",
       "z\n",
       "\" id=\"DejaVuSans-53\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-53\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_3\">\n",
       "     <g id=\"line2d_3\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"160.833556\" xlink:href=\"#m5780cffe78\" y=\"146.838657\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_3\">\n",
       "      <!-- 1000 -->\n",
       "      <g transform=\"translate(148.108556 161.437095)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 12.40625 8.296875 \n",
       "L 28.515625 8.296875 \n",
       "L 28.515625 63.921875 \n",
       "L 10.984375 60.40625 \n",
       "L 10.984375 69.390625 \n",
       "L 28.421875 72.90625 \n",
       "L 38.28125 72.90625 \n",
       "L 38.28125 8.296875 \n",
       "L 54.390625 8.296875 \n",
       "L 54.390625 0 \n",
       "L 12.40625 0 \n",
       "z\n",
       "\" id=\"DejaVuSans-49\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_2\">\n",
       "    <g id=\"ytick_1\">\n",
       "     <g id=\"line2d_4\">\n",
       "      <defs>\n",
       "       <path d=\"M 0 0 \n",
       "L -3.5 0 \n",
       "\" id=\"m6a36c3c3a4\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.65\" xlink:href=\"#m6a36c3c3a4\" y=\"10.999219\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_4\">\n",
       "      <!-- 0 -->\n",
       "      <g transform=\"translate(26.2875 14.798437)scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_2\">\n",
       "     <g id=\"line2d_5\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.65\" xlink:href=\"#m6a36c3c3a4\" y=\"35.223818\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_5\">\n",
       "      <!-- 200 -->\n",
       "      <g transform=\"translate(13.5625 39.023036)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 19.1875 8.296875 \n",
       "L 53.609375 8.296875 \n",
       "L 53.609375 0 \n",
       "L 7.328125 0 \n",
       "L 7.328125 8.296875 \n",
       "Q 12.9375 14.109375 22.625 23.890625 \n",
       "Q 32.328125 33.6875 34.8125 36.53125 \n",
       "Q 39.546875 41.84375 41.421875 45.53125 \n",
       "Q 43.3125 49.21875 43.3125 52.78125 \n",
       "Q 43.3125 58.59375 39.234375 62.25 \n",
       "Q 35.15625 65.921875 28.609375 65.921875 \n",
       "Q 23.96875 65.921875 18.8125 64.3125 \n",
       "Q 13.671875 62.703125 7.8125 59.421875 \n",
       "L 7.8125 69.390625 \n",
       "Q 13.765625 71.78125 18.9375 73 \n",
       "Q 24.125 74.21875 28.421875 74.21875 \n",
       "Q 39.75 74.21875 46.484375 68.546875 \n",
       "Q 53.21875 62.890625 53.21875 53.421875 \n",
       "Q 53.21875 48.921875 51.53125 44.890625 \n",
       "Q 49.859375 40.875 45.40625 35.40625 \n",
       "Q 44.1875 33.984375 37.640625 27.21875 \n",
       "Q 31.109375 20.453125 19.1875 8.296875 \n",
       "z\n",
       "\" id=\"DejaVuSans-50\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-50\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_3\">\n",
       "     <g id=\"line2d_6\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.65\" xlink:href=\"#m6a36c3c3a4\" y=\"59.448417\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_6\">\n",
       "      <!-- 400 -->\n",
       "      <g transform=\"translate(13.5625 63.247635)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 37.796875 64.3125 \n",
       "L 12.890625 25.390625 \n",
       "L 37.796875 25.390625 \n",
       "z\n",
       "M 35.203125 72.90625 \n",
       "L 47.609375 72.90625 \n",
       "L 47.609375 25.390625 \n",
       "L 58.015625 25.390625 \n",
       "L 58.015625 17.1875 \n",
       "L 47.609375 17.1875 \n",
       "L 47.609375 0 \n",
       "L 37.796875 0 \n",
       "L 37.796875 17.1875 \n",
       "L 4.890625 17.1875 \n",
       "L 4.890625 26.703125 \n",
       "z\n",
       "\" id=\"DejaVuSans-52\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-52\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_4\">\n",
       "     <g id=\"line2d_7\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.65\" xlink:href=\"#m6a36c3c3a4\" y=\"83.673016\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_7\">\n",
       "      <!-- 600 -->\n",
       "      <g transform=\"translate(13.5625 87.472234)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 33.015625 40.375 \n",
       "Q 26.375 40.375 22.484375 35.828125 \n",
       "Q 18.609375 31.296875 18.609375 23.390625 \n",
       "Q 18.609375 15.53125 22.484375 10.953125 \n",
       "Q 26.375 6.390625 33.015625 6.390625 \n",
       "Q 39.65625 6.390625 43.53125 10.953125 \n",
       "Q 47.40625 15.53125 47.40625 23.390625 \n",
       "Q 47.40625 31.296875 43.53125 35.828125 \n",
       "Q 39.65625 40.375 33.015625 40.375 \n",
       "z\n",
       "M 52.59375 71.296875 \n",
       "L 52.59375 62.3125 \n",
       "Q 48.875 64.0625 45.09375 64.984375 \n",
       "Q 41.3125 65.921875 37.59375 65.921875 \n",
       "Q 27.828125 65.921875 22.671875 59.328125 \n",
       "Q 17.53125 52.734375 16.796875 39.40625 \n",
       "Q 19.671875 43.65625 24.015625 45.921875 \n",
       "Q 28.375 48.1875 33.59375 48.1875 \n",
       "Q 44.578125 48.1875 50.953125 41.515625 \n",
       "Q 57.328125 34.859375 57.328125 23.390625 \n",
       "Q 57.328125 12.15625 50.6875 5.359375 \n",
       "Q 44.046875 -1.421875 33.015625 -1.421875 \n",
       "Q 20.359375 -1.421875 13.671875 8.265625 \n",
       "Q 6.984375 17.96875 6.984375 36.375 \n",
       "Q 6.984375 53.65625 15.1875 63.9375 \n",
       "Q 23.390625 74.21875 37.203125 74.21875 \n",
       "Q 40.921875 74.21875 44.703125 73.484375 \n",
       "Q 48.484375 72.75 52.59375 71.296875 \n",
       "z\n",
       "\" id=\"DejaVuSans-54\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-54\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_5\">\n",
       "     <g id=\"line2d_8\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.65\" xlink:href=\"#m6a36c3c3a4\" y=\"107.897614\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_8\">\n",
       "      <!-- 800 -->\n",
       "      <g transform=\"translate(13.5625 111.696833)scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path d=\"M 31.78125 34.625 \n",
       "Q 24.75 34.625 20.71875 30.859375 \n",
       "Q 16.703125 27.09375 16.703125 20.515625 \n",
       "Q 16.703125 13.921875 20.71875 10.15625 \n",
       "Q 24.75 6.390625 31.78125 6.390625 \n",
       "Q 38.8125 6.390625 42.859375 10.171875 \n",
       "Q 46.921875 13.96875 46.921875 20.515625 \n",
       "Q 46.921875 27.09375 42.890625 30.859375 \n",
       "Q 38.875 34.625 31.78125 34.625 \n",
       "z\n",
       "M 21.921875 38.8125 \n",
       "Q 15.578125 40.375 12.03125 44.71875 \n",
       "Q 8.5 49.078125 8.5 55.328125 \n",
       "Q 8.5 64.0625 14.71875 69.140625 \n",
       "Q 20.953125 74.21875 31.78125 74.21875 \n",
       "Q 42.671875 74.21875 48.875 69.140625 \n",
       "Q 55.078125 64.0625 55.078125 55.328125 \n",
       "Q 55.078125 49.078125 51.53125 44.71875 \n",
       "Q 48 40.375 41.703125 38.8125 \n",
       "Q 48.828125 37.15625 52.796875 32.3125 \n",
       "Q 56.78125 27.484375 56.78125 20.515625 \n",
       "Q 56.78125 9.90625 50.3125 4.234375 \n",
       "Q 43.84375 -1.421875 31.78125 -1.421875 \n",
       "Q 19.734375 -1.421875 13.25 4.234375 \n",
       "Q 6.78125 9.90625 6.78125 20.515625 \n",
       "Q 6.78125 27.484375 10.78125 32.3125 \n",
       "Q 14.796875 37.15625 21.921875 38.8125 \n",
       "z\n",
       "M 18.3125 54.390625 \n",
       "Q 18.3125 48.734375 21.84375 45.5625 \n",
       "Q 25.390625 42.390625 31.78125 42.390625 \n",
       "Q 38.140625 42.390625 41.71875 45.5625 \n",
       "Q 45.3125 48.734375 45.3125 54.390625 \n",
       "Q 45.3125 60.0625 41.71875 63.234375 \n",
       "Q 38.140625 66.40625 31.78125 66.40625 \n",
       "Q 25.390625 66.40625 21.84375 63.234375 \n",
       "Q 18.3125 60.0625 18.3125 54.390625 \n",
       "z\n",
       "\" id=\"DejaVuSans-56\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-56\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_6\">\n",
       "     <g id=\"line2d_9\">\n",
       "      <g>\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"39.65\" xlink:href=\"#m6a36c3c3a4\" y=\"132.122213\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_9\">\n",
       "      <!-- 1000 -->\n",
       "      <g transform=\"translate(7.2 135.921432)scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"127.246094\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "       <use x=\"190.869141\" xlink:href=\"#DejaVuSans-48\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 39.65 146.838657 \n",
       "L 39.65 10.938657 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 216.00508 146.838657 \n",
       "L 216.00508 10.938657 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 39.65 146.838657 \n",
       "L 216.00508 146.838657 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 39.65 10.938657 \n",
       "L 216.00508 10.938657 \n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"p1fee7d7dcf\">\n",
       "   <rect height=\"135.9\" width=\"176.35508\" x=\"39.65\" y=\"10.938657\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.set_figsize()\n",
    "print('input image shape:', img.permute(1, 2, 0).shape)\n",
    "d2l.plt.imshow(img.permute(1, 2, 0));\n",
    "print('output image shape:', out_img.shape)\n",
    "d2l.plt.imshow(out_img);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 27
   },
   "source": [
    "在全卷积网络中，我们[**用双线性插值的上采样初始化转置卷积层。对于$1\\times 1$卷积层，我们使用Xavier初始化参数。**]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "origin_pos": 29,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "# 用双线性插值的上采样初始化转置卷积层\n",
    "W = bilinear_kernel(num_classes, num_classes, 64)\n",
    "net.transpose_conv.weight.data.copy_(W);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 30
   },
   "source": [
    "## [**读取数据集**]\n",
    "\n",
    "我们用 :numref:`sec_semantic_segmentation`中介绍的语义分割读取数据集。\n",
    "指定随机裁剪的输出图像的形状为$320\\times 480$：高和宽都可以被$32$整除。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "origin_pos": 31,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "read 1114 examples\n",
      "read 1078 examples\n"
     ]
    }
   ],
   "source": [
    "batch_size, crop_size = 32, (320, 480)\n",
    "train_iter, test_iter = d2l.load_data_voc(batch_size, crop_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 32
   },
   "source": [
    "## [**训练**]\n",
    "\n",
    "现在我们可以训练全卷积网络了。\n",
    "这里的损失函数和准确率计算与图像分类中的并没有本质上的不同，因为我们使用转置卷积层的通道来预测像素的类别，所以需要在损失计算中指定通道维。\n",
    "此外，模型基于每个像素的预测类别是否正确来计算准确率。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 34,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "def loss(inputs, targets):\n",
    "    return F.cross_entropy(inputs, targets, reduction='none').mean(1).mean(1) # 矩阵取均值\n",
    "\n",
    "num_epochs, lr, wd, devices = 5, 0.001, 1e-3, d2l.try_all_gpus()\n",
    "trainer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=wd)\n",
    "d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 35
   },
   "source": [
    "## [**预测**]\n",
    "\n",
    "在预测时，我们需要将输入图像在各个通道做标准化，并转成卷积神经网络所需要的四维输入格式。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 37,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "def predict(img):\n",
    "    X = test_iter.dataset.normalize_image(img).unsqueeze(0)\n",
    "    pred = net(X.to(devices[0])).argmax(dim=1) # 通道纬度\n",
    "    return pred.reshape(pred.shape[1], pred.shape[2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 38
   },
   "source": [
    "为了[**可视化预测的类别**]给每个像素，我们将预测类别映射回它们在数据集中的标注颜色。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 40,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "def label2image(pred):\n",
    "    colormap = torch.tensor(d2l.VOC_COLORMAP, device=devices[0])\n",
    "    X = pred.long()\n",
    "    return colormap[X, :]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 41
   },
   "source": [
    "测试数据集中的图像大小和形状各异。\n",
    "由于模型使用了步幅为32的转置卷积层，因此当输入图像的高或宽无法被32整除时，转置卷积层输出的高或宽会与输入图像的尺寸有偏差。\n",
    "为了解决这个问题，我们可以在图像中截取多块高和宽为32的整数倍的矩形区域，并分别对这些区域中的像素做前向传播。\n",
    "请注意，这些区域的并集需要完整覆盖输入图像。\n",
    "当一个像素被多个区域所覆盖时，它在不同区域前向传播中转置卷积层输出的平均值可以作为`softmax`运算的输入，从而预测类别。\n",
    "\n",
    "为简单起见，我们只读取几张较大的测试图像，并从图像的左上角开始截取形状为$320\\times480$的区域用于预测。\n",
    "对于这些测试图像，我们逐一打印它们截取的区域，再打印预测结果，最后打印标注的类别。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "origin_pos": 43,
    "tab": [
     "pytorch"
    ]
   },
   "outputs": [],
   "source": [
    "voc_dir = d2l.download_extract('voc2012', 'VOCdevkit/VOC2012')\n",
    "test_images, test_labels = d2l.read_voc_images(voc_dir, False)\n",
    "n, imgs = 4, []\n",
    "for i in range(n):\n",
    "    crop_rect = (0, 0, 320, 480)\n",
    "    X = torchvision.transforms.functional.crop(test_images[i], *crop_rect)\n",
    "    pred = label2image(predict(X))\n",
    "    imgs += [X.permute(1,2,0), pred.cpu(),\n",
    "             torchvision.transforms.functional.crop(\n",
    "                 test_labels[i], *crop_rect).permute(1,2,0)]\n",
    "d2l.show_images(imgs[::3] + imgs[1::3] + imgs[2::3], 3, n, scale=2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 44
   },
   "source": [
    "## 小结\n",
    "\n",
    "* 全卷积网络先使用卷积神经网络抽取图像特征，然后通过$1\\times 1$卷积层将通道数变换为类别个数，最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。\n",
    "* 在全卷积网络中，我们可以将转置卷积层初始化为双线性插值的上采样。\n",
    "\n",
    "## 练习\n",
    "\n",
    "1. 如果将转置卷积层改用Xavier随机初始化，结果有什么变化？\n",
    "1. 调节超参数，能进一步提升模型的精度吗？\n",
    "1. 预测测试图像中所有像素的类别。\n",
    "1. 最初的全卷积网络的论文中 :cite:`Long.Shelhamer.Darrell.2015`还使用了某些卷积神经网络中间层的输出。试着实现这个想法。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "origin_pos": 46,
    "tab": [
     "pytorch"
    ]
   },
   "source": [
    "[Discussions](https://discuss.d2l.ai/t/3297)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
